package Persistencia.Entidad;

import java.util.ArrayList;
import java.util.List;

public class Partido {
	//Variables
	private Integer id;
	private Partido siguientePartidoEnRondaGanadores=null;
	private Partido siguientePartidoEnRondaPerdedores=null;
	private List<ResultadoDePartido> resultados = new ArrayList<ResultadoDePartido>();
	private Participante participante1=null;
	private Participante participante2=null;
	private LugarDeCompetencia lugarDeCompetencia;
	//Fin Variables
	
	//Constructores
	public Partido() {
		
	}
	public Partido(Participante participante1, Participante participante2,
			LugarDeCompetencia lugarDeCompetencia) {
		this.participante1 = participante1;
		this.participante2 = participante2;
		this.lugarDeCompetencia = lugarDeCompetencia;
	}
	//Fin Constructores
	
	//Getters Basicos
	public Integer getId() {
		return id;
	}
	public Partido getSiguientePartidoEnRondaGanadores() {
		return siguientePartidoEnRondaGanadores;
	}
	public Partido getSiguientePartidoEnRondaPerdedores() {
		return siguientePartidoEnRondaPerdedores;
	}
	public List<ResultadoDePartido> getResultados() {
		return resultados;
	}
	public Participante getParticipante1() {
		return participante1;
	}
	public Participante getParticipante2() {
		return participante2;
	}
	public LugarDeCompetencia getLugarDeCompetencia() {
		return lugarDeCompetencia;
	}
	//Fin Getters
	
	//Setters Basicos
	public void setId(Integer id) {
		this.id = id;
	}
	public void setSiguientePartidoEnRondaGanadores(
			Partido siguientePartidoEnRondaGanadores) {
		this.siguientePartidoEnRondaGanadores = siguientePartidoEnRondaGanadores;
	}
	public void setSiguientePartidoEnRondaPerdedores(
			Partido siguientePartidoEnRondaPerdedores) {
		this.siguientePartidoEnRondaPerdedores = siguientePartidoEnRondaPerdedores;
	}
	public void setResultados(List<ResultadoDePartido> resultados) {
		this.resultados = resultados;
	}
	public void setParticipante1(Participante participante1) {
		this.participante1 = participante1;
	}
	public void setParticipante2(Participante participante2) {
		this.participante2 = participante2;
	}
	public void setLugarDeCompetencia(LugarDeCompetencia lugarDeCompetencia) {
		this.lugarDeCompetencia = lugarDeCompetencia;
	}
	//Fin Setters
	
	//Getters
	public String getNombreParticipante1() {
		return participante1.getNombre();
	}
	public String getNombreParticipante2() {
		return participante2.getNombre();
	}
	public int getGolesAFavor(int idParticipante) {
		if (resultados.isEmpty())
			return -1;
		if(participante1.getId()==idParticipante)
			return getResultado1((Puntuacion) resultados.get(0));
		else
			return getResultado2((Puntuacion) resultados.get(0));	
	}
	private int getResultado1(Puntuacion puntuacion) {

		return puntuacion.getPuntajeParticipante1();
	}
	private int getResultado2(Puntuacion puntuacion) {

		return puntuacion.getPuntajeParticipante2();
	}
	public int getGolesEnContra(int idParticipante) {
		if (resultados.isEmpty())
			return -1;
		if(participante1.getId()==idParticipante)
			return getResultado2((Puntuacion) resultados.get(0));
		else
			return getResultado1((Puntuacion) resultados.get(0));	
		}
	public Puntuacion getPuntuacion() {
		if (resultados.isEmpty())
			return null;
		return (Puntuacion) resultados.get(0);
	}
	public ResultadoFinal getResultadoFinal() {
		if (resultados.isEmpty())
			return null;
		return (ResultadoFinal) resultados.get(0);
	}
	public Set getSet(int i) {
		if(resultados.size()<i){
			return new Set();
		}
		else{
			return (Set) resultados.get(i);
		}
	}
	//Fin de Getters
	
	//Preguntas
	public Boolean permisoGestionResultado() {
		
		//Efectos en:
		//>modo Eliminatoria: Comprueba que los partidos anteriores se hayan jugado.
		//>modo Liga : Ninguno, se supone que ambos participantes existen.
		if(participante1==null){
			return false;
		}
		if(participante2==null){
			return false;
		}
		//Fin
		
		//Comprueba si los partidos posteriores se jugaron
		//siguientePartidoEnRondaGanadores solo lo crea el fixture eliminatoria (simple y doble)
		if(this.siguientePartidoEnRondaGanadores!=null){
			//si el partido siguiente tiene resultados no se podra editar el partido
			if(this.siguientePartidoEnRondaGanadores.resultados!=null){
				return false;
			}
		}
		//siguientePartidoEnRondaGanadores solo lo crea el fixture eliminatoria doble
		if(this.siguientePartidoEnRondaPerdedores!=null){
			//si el partido siguiente tiene resultados no se podra editar el partido
			if(this.siguientePartidoEnRondaPerdedores.resultados!=null){
				return false;
			}
		}
		//Fin
			
		return true;
	}
	public Boolean existeResultado() {
		if(resultados.isEmpty())
			return false;
		
		return true;
	}
	public Boolean ganoPart1Set() {
		
		int part1 = 0;
		int part2 = 0;
		for(int i = 0; i < resultados.size(); i++)
		{
			Set set = this.getSet((Set) resultados.get(i));
			if(set.getPuntajeParticipante1() < set.getPuntajeParticipante2())
				part2++;
			else
				part1++;
				
		}
		if (part1 > part2)
			return true;
		else
			return false;
	}
	//Fin Preguntas

	//Cast
	private Set getSet(Set set) {
		return set;
	}
	//Fin de Cast

	//Adds
	public void addPuntuacion(Puntuacion puntuacion) {
		resultados.add(puntuacion);
	}
	public void addResultadoFinal(ResultadoFinal resultadoF) {
		resultados.add(resultadoF);
	}
	public void addSet(Set set) {
		resultados.add(set);
	}
	public void updateSet(Set set, int i) {
		resultados.set(i, set);
	}
	//Fin de Adds
	public void updatePuntuacion(Puntuacion puntuacion) {
		resultados.set(0, puntuacion);
	}
	public void updateResultadoFinal(ResultadoFinal resultadoF) {
		resultados.set(0, resultadoF);
	}

//Codigo Basura
	/*public String ganoResultadoFinal() {
		ResultadoFinal resultadofinal = this.getResultadoFinal((ResultadoFinal)resultados.get(0));
		DAOCompetencia daoCompetencia = new DAOCompetencia();
		
		String ganador = daoCompetencia.getParticipante(resultadofinal.getIdParticipanteGanador()).
					getNombre();
			
	return ganador;
	}
	
	private ResultadoFinal getResultadoFinal(ResultadoFinal resultadoFinal) {
		return resultadoFinal;
	}*/
//Codigo Repetido
	
/*public Boolean tieneResultado() {
	if(resultados==null){
		return false;
	}
	return true;
}*/
}